﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using System.Collections;

using Controller;    // Bruger namespace for Controller-komponenten
using Interfaces;    // Bruger namespace for Interface-komponenten


namespace GUI
{
    public partial class FrmOrdre : Form
    {
        private FrisørSystem frisørSystem;     // associering til ordresystem

        public FrmOrdre(FrisørSystem frisørsystem)
        {
            InitializeComponent();

            this.frisørSystem = frisørsystem;		// oprettelse af associering til ordresystem

            opdaterOrdrenumreEksp();

            List<long> varenumre = frisørsystem.FindVarenumre();   // Læs varenumre varecollection
            foreach (long varenr in varenumre)
            {
                cboVarer.Items.Add(varenr);           // skriv varenr til combobox
            }
            cboVarer.SelectedIndex = 0;      // Vælg første varenr

            starttilstand();
        }

        private void starttilstand()
        {
            btnNy.Enabled = true;
            btnGem.Enabled = false;
            btnFortryd.Enabled = false;
            btnTilfoejOrdrelinie.Enabled = false;
            btnEkspeder.Enabled = false;

            cboVarer.Enabled = false;
            cboOrdrerEksp.Enabled = true;

            txtOrdrenr.ReadOnly = true;
            dtpOrdredato.Enabled = true;
            dtpLevDato.Enabled = true;
            txtAntal.ReadOnly = true;

            cboOrdrerEksp.SelectedIndex = -1;
            txtOrdrenr.Clear();
            dtpLevDato.Value = DateTime.Now;
            dtpOrdredato.Value = DateTime.Now;
            txtAntal.Clear();
            txtOrdresum.Clear();
            lstOrdrelinier.Items.Clear();
        }

        private void normaltilstand()
        {
            btnNy.Enabled = true;
            btnGem.Enabled = false;
            btnFortryd.Enabled = false;
            btnTilfoejOrdrelinie.Enabled = false;
            btnEkspeder.Enabled = true;

            cboVarer.Enabled = false;
            cboOrdrerEksp.Enabled = true;

            txtOrdrenr.ReadOnly = true;
            dtpOrdredato.Enabled = true;
            dtpLevDato.Enabled = true;
            txtAntal.ReadOnly = true;
        }

        private void oprettilstand()
        {
            btnNy.Enabled = false;
            btnGem.Enabled = true;
            btnFortryd.Enabled = true;
            btnTilfoejOrdrelinie.Enabled = true;
            btnEkspeder.Enabled = false;

            cboVarer.Enabled = true;
            cboOrdrerEksp.Enabled = false;

            txtOrdrenr.ReadOnly = false;
            dtpOrdredato.Enabled = true;
            dtpLevDato.Enabled = true;
            txtAntal.ReadOnly = false;

            cboOrdrerEksp.SelectedIndex = -1;
            txtOrdrenr.Clear();
            dtpLevDato.Value = DateTime.Now;
            dtpOrdredato.Value = DateTime.Now;
            txtAntal.Clear();
            txtOrdresum.Clear();
            lstOrdrelinier.Items.Clear();
        }

        // Fortryd oprettelse af ordre
        private void btnFortryd_Click(object sender, EventArgs e)
        {
            starttilstand();
        }

        private void btnAfslut_Click(object sender, EventArgs e)
        {
            Close();
        }

        // Visning af ordreoplysninger for valgt ordre i combo-box
        private void cboOrdrerEksp_SelectedIndexChanged(object sender, EventArgs e)
        {
            //Ordrelinie ordrelinie;

            IOrdreliniedata ordreliniedata;
            IVaredata varedata;

            if (cboOrdrerEksp.SelectedIndex != -1)
            {
                int ordrenr = (int)(cboOrdrerEksp.SelectedItem);
                IOrdredata ordre = frisørSystem.FindOrdre(ordrenr);      // hent ordre

                // Opdatér ordreoplysninger
                txtOrdrenr.Text = ordrenr.ToString();
                dtpOrdredato.Value = ordre.OrdreDato;
                dtpLevDato.Value = ordre.LeveringsDato;

                lstOrdrelinier.Items.Clear();    // Clear listview

               
                // Hent ordrelinie-iterator
                IEnumerator ordrelinieIterator = frisørSystem.GetOrdrelinieEnumerator();

                // Gennemløb ordrelinier og indsæt dem i listview
                ordrelinieIterator.Reset();
                while (ordrelinieIterator.MoveNext())
                {
                    ordreliniedata = (IOrdreliniedata)ordrelinieIterator.Current;
                    varedata = frisørSystem.FindVare(ordreliniedata.IVare.Varenr);
                    TilfoejOrdrelinieListView(ordreliniedata.Antal, varedata);
                }

                double ordresum = BeregnOrdresum();
                txtOrdresum.Text = ordresum.ToString();		// skriv ordresum

                if (!frisørSystem.KanEkspederes())
                {
                    MessageBox.Show("Ordren kan ikke ekspederes, da der mangler varer på lageret", "Kan ikke ekspederes", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
                //else frisørSystem.EkspederOrdre();

                normaltilstand();
            }
        }

        // Tilføj ordrelinie til list-view
        private void btnTilfoejOrdrelinie_Click(object sender, EventArgs e)
        {
            int antal;
            bool res;

            long varenr = (long)(cboVarer.Items[cboVarer.SelectedIndex]);

            // Indlæs antal
            res = int.TryParse(txtAntal.Text, out antal);
            if (!res)
            {
                MessageBox.Show("Indtast venligst antal (heltal)");
                txtAntal.Focus();
                return;
            }

            IVaredata vare = frisørSystem.FindVare(varenr);

            TilfoejOrdrelinieListView(antal, vare);

            double ordresum = BeregnOrdresum();
            txtOrdresum.Text = ordresum.ToString();		// skriv ordresum
        }

        // Beregner ordresummen udfra ordrelinier i listview
        private double BeregnOrdresum()
        {
            ListViewItem linie;
            double ordresum = 0.0;

            for (int i = 0; i < lstOrdrelinier.Items.Count; i++)  // gennemløb ordrelinier i listview
            {
                linie = lstOrdrelinier.Items[i];	      // linie i list-view
                ordresum += Convert.ToDouble(linie.SubItems[4].Text);	// kolonne prisIalt
            }

            return ordresum;
        }

        // Hjælpemetode, som tilføjer en ordrelinie til list-view
        private void TilfoejOrdrelinieListView(int antal, IVaredata vareData)
        {
            double prisIalt = antal * vareData.Pris;

            ListViewItem linie = new ListViewItem();			// opret linie i listview
            linie.Text = antal.ToString();		         // Første kolonne i linie

            // Her følger de øvrige kolonner i linie
            linie.SubItems.Add(vareData.Varenr.ToString());
            linie.SubItems.Add(vareData.Betegnelse);
            linie.SubItems.Add(vareData.Pris.ToString());
            linie.SubItems.Add(prisIalt.ToString());

            lstOrdrelinier.Items.Add(linie);	// Tilføj linie til list-view
        }

        private void btnNy_Click(object sender, EventArgs e)
        {
            oprettilstand();
            txtOrdrenr.Focus();
        }

        private void btnGem_Click(object sender, EventArgs e)
        {
            int antal;
            long varenr;
            ListViewItem linie;
            int ordrenr;

            // Indlæs ordrenr
            bool res = int.TryParse(txtOrdrenr.Text, out ordrenr);
            if (!res)
            {
                MessageBox.Show("Indtast venligst ordrenr (heltal)");
                txtOrdrenr.Focus();
                return;
            }

            // Check, at der er oprettet ordrelinie
            if (lstOrdrelinier.Items.Count == 0)
            {
                MessageBox.Show("Indtast venligst nogle ordrelinier først");
                cboVarer.Focus();
                return;

            }

            // Opret ordre
            frisørSystem.RegistrerOrdre(ordrenr, dtpOrdredato.Value, dtpLevDato.Value);

            // Opret ordrelinier ved gennemløb af listview
            for (int i = 0; i < lstOrdrelinier.Items.Count; i++)
            {
                linie = lstOrdrelinier.Items[i];
                antal = Convert.ToInt32(linie.Text);
                varenr = Convert.ToInt64(linie.SubItems[1].Text);
                frisørSystem.RegistrerOrdrelinie(frisørSystem.FindVare(varenr), antal);
            }
            opdaterOrdrenumreEksp();   // opdaterer combobox med ordrenumre, der skal ekspederes
            MessageBox.Show("Ordren er registreret");

            starttilstand();
        }

        // Opdaterer combobox med de ordrenumre, der skal ekspederes
        private void opdaterOrdrenumreEksp()
        {
            cboOrdrerEksp.Items.Clear();

            List<int> ordrenumreEksp = frisørSystem.FindOrdrenumreEksp();

            // Put ordrenumre ind i combobox
            foreach (int ordrenr in ordrenumreEksp)
            {
                cboOrdrerEksp.Items.Add(ordrenr);
            }
        }

        // ændret i forbindelse med brug af sessionController
        // Da frisørsystem kender aktuel ordre skal der ikke sendes ordrenr  *** Ulla
        private void btnEkspeder_Click(object sender, EventArgs e)
        {
            int ordrenr = (int)(cboOrdrerEksp.SelectedItem);

            if (!frisørSystem.KanEkspederes()) // ordrenr fjernet som parameter
            {
                MessageBox.Show("Ordren kan ikke ekspederes, da der mangler varer på lageret", "Kan ikke ekspederes", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

            frisørSystem.EkspederOrdre(); // ordrenr fjernet som parameter

            opdaterOrdrenumreEksp();   // opdaterer combobox med ordrenumre, der skal ekspederes
            MessageBox.Show("Ordren er ekspederet");

            starttilstand();
        }
    }
}
